
library ieee;
use ieee.std_logic_1164.all;
use work.mystd.all;

entity ProcesorTB is
end ProcesorTB;     
        

architecture ProcesorTB of ProcesorTB is
    
	signal clk : std_logic := '0';	 -- signal takta
	signal reset : std_logic := '0'; -- RESET signal
    
    
	signal M1Bus : bus32;			-- interna magistrala M1
	signal M2Bus : bus32;			-- interna magistrala M2
	signal M3Bus : bus32;			-- interna magistrala M3
	signal ABUS : bus32;			-- adresna magistrala
	signal DBUS : bus32;			-- magistrala podataka
	
	signal read : std_logic;		-- upravljacki signal za memoriju, prilikom citanja memorije
	signal write : std_logic;		-- upravljacki signal za memoriju, pirlikom upisa u memoriju
   
    -- PC BLOCK
    
    signal PCin : std_logic;		-- upravljacki signal za upis u PC
    signal PCout : std_logic;		-- upravljacki signal za postavljanje sadrzaja PC-a na M3Bus   
    signal incPC : std_logic;		-- upravljacki signal kojim se inkrementira sadrzaj registra PC

	
	-- INSTRUCTION BLOCK
    
    signal loadIR : std_logic;		-- upravljacki signal za upis u INSTRUCTION REGISTER sa M3Bus
    signal clrIR : std_logic;		-- upravljacki signal kojim se brise sadrzaj IR registra
    signal rdValue : bus5;			-- indeks odredisnog operanda u registarskom fajlu
    signal rs1Value : bus5;			-- indeks prvog operanda u registarskom fajlu
    signal rs2Value : bus5;			-- indeks drugog operanda u registarskom fajlu
    signal immValue : bus32;		-- neposredna vrednost 
    signal opcode : bus6;			-- opcode instrukcije
    
    -- REG BLOCK
    
    signal regsel1 : std_logic;		-- upravljacki signal kojim se prvi operand posatvlja na linije reg1
    signal regsel2 : std_logic;		-- upravljacki signal kojim se drugi operand postavlja na linije reg2
    signal regsel3 : std_logic;		-- upravljacki signal kojim se odredisni operand postavlja na linije reg3
    signal regIN  : std_logic;		-- upravljacki signal kojim se vrsi upis vrednost sa M3 u odredisni registar
    signal reg2M3 : std_logic;
    
    
    -- MEMORY INTERFACE
    
    signal loadMAR : std_logic;		-- upravljacki signal kojim se vrsi upis sadrzaja sa M3 u MAR
    signal outMAR : std_logic;		-- upravljacki signal za postavljanje sadrzaja MAR-a na ABUS
    signal loadMBRproc : std_logic; -- upravljacki signal kojim se vrsi upis u registar MBR odredisnog operanda iz REG bloka
    signal loadMBRmem : std_logic;	-- upravljacki signal kojim se vrsi upis sa DBUS u MBR
    signal outMBRproc : std_logic;	-- postavljanje sadrzanja registra MBR na linije M3Bus
	signal outMBRmem  : std_logic;	-- postavljanje sadrzaja registra MBR na linije DBUS
	
	-- ALU BLOCK
	
	signal ALUop : std_logic;		-- upravljacki signal za izvrsavanje alu operacije
	signal aluOut : std_logic;		-- signal kojim se rezultat ALU operacije postavlja na linije M3Bus
	signal interrupt : std_logic;	-- signal koji predstavlja prekid prilikom ilegalnog koda instrukcije
									-- prekoracenja adrese ili stack overflow-a
	signal branchALU : std_logic;	-- u slucaju instrukcije uslovnih skokova, predstavlja da li je uslov za skok ispunjen
	
	-- CONTROL UNIT
	
	signal branch : std_logic;		-- upravljacki signal za azuriranje brojaca koraka ako je dosla do skoka
	signal brop : std_logic;		-- upravljacki signal za azuriranje brojaca koraka ako se odredjuje trenutna instrukcija
	
	signal kmbranchOUT : bus8;		-- vrednost kojom treba azurirati brojac koraka
	signal kmopOUT : bus8;			-- --||--
	signal counterValue : bus8;		-- vrednost brojaca koraka
	
	signal prekid : std_logic;		-- isto sto i halt, sluzi samo u simulaciji
	
	signal testRequest : std_logic := '0';
	signal testSuccess : std_logic;
               
begin  

	PCBlock : entity work.PCBlock(PCBlock)
			  port map (clk, reset, PCin, PCout, incPC, M3Bus);
			  
    instructionBlock : entity work.instructionBlock(instructionBlock)
    				   port map (clk, reset, M3Bus, loadIR, clrIR, rdValue, rs1Value, rs2Value, immValue, opcode );
    				   
    regBlock : entity work.regBlock(regBlock)
    		   port map(clk, reset, regsel1, rs1Value, regsel2, rs2Value, regsel3, rdValue, regIN, M1Bus, M2Bus, M3Bus, reg2M3);
    		   				   
	MemoryInterface : entity work.MemoryInterface(MemoryInterface)
					  port map (clk, reset, loadMAR, outMAR, loadMBRproc, loadMBRmem, outMBRproc, outMBRmem, ABUS, DBUS, M3Bus);
					  
					  
    ALUBlock : entity work.ALUBlock(ALUBlock)
    		   port map (clk, reset, M1Bus, M2Bus, M3Bus, immValue, opcode, ALUop, aluOut, interrupt, branchALU);
    		   
    ControlUnit : entity work.ControlUnit(ControlUnit)
    			  port map(clk, reset, branch, brop, kmbranchOUT, kmopOUT, interrupt, opcode, counterValue, prekid);
    			  
    genSignals : entity work.genSignals(genSignals)
    			 port map(counterValue, PCout, loadMAR, incPC, read, loadMBRmem, loadIR, brop, 
    			 		  regsel1, ALUop, aluOut, outMBRproc, regIN, regsel3, loadMBRproc, write,
    			 		  regsel2, PCin, clrIR, outMAR, outMBRmem, reg2M3 );	
    			 		  
    KMBRANCH :  entity work.KMBRANCH(KMBRANCH)
    			port map(branchALU, counterValue, kmbranchOUT, branch);		
    			   			
    KMOP : entity work.KMOP(KMOP)
			port map(opcode, kmopOUT);
	
	Memory : entity work.Memory(Memory)
			port map(clk, ABUS, DBUS, read, write, testRequest, testSuccess);
			
	clk <= not clk after 10 ns;

	
	test : process is
	begin
	    testRequest <= '0';
		wait for 5 ns;
		reset <= '1';
		wait for 20 ns;
		reset <= '0';
		
		wait until prekid = '1';
		testRequest <= '1';
		wait;
	
	end process test;
		
end ProcesorTB;








